#include <stdio.h>
#include <iostream>
#include <string>
#include <ctime>
#include <unistd.h>

//技巧：加上do while循环能应用于代码的各种情况
//宏里面不能有换行，所以加上\转义换行，代表后面没有换行
#define INF 0
#define DBG 1
#define ERR 2
#define LOG_LEVEL DBG
#define LOG(level, format, ...)                                                                 \
    do                                                                                          \
    {                                                                                           \
    if (LOG_LEVEL > level)                                                                      \
        break;                                                                                  \
    time_t t = time(NULL);                                                                      \
    struct tm* lltime = localtime(&t);                                                          \
    char time[32];                                                                              \
    strftime(time, 31, "%H:%M:%S", lltime);                                                     \
    fprintf(stdout, "[%p %s %s:%d] " format "\n",(void*)pthread_self(), time, __FILE__, __LINE__, ##__VA_ARGS__);        \
    } while (0)
#define INF_LOG(format, ...) LOG(INF, format, ##__VA_ARGS__)// 使用不定参的...只能声明定义的时候用，使用的时候用__VA_ARGS__
#define DBG_LOG(format, ...) LOG(DBG, format, ##__VA_ARGS__)
#define ERR_LOG(format, ...) LOG(ERR, format, ##__VA_ARGS__)
int main()
{
    for (int i = 0; i < 2; ++i)
    {
        sleep(1);
        INF_LOG("hello world1");
        DBG_LOG("hello world2");
        ERR_LOG("hello world3");
    }
    return 0;
}
